iconhelper: Ensure the surface used for textures is ARGB32
authorTimm Bäder <mail@baedert.org>
Fri, 2 Dec 2016 16:32:12 +0000 (17:32 +0100)
committerTimm Bäder <mail@baedert.org>
Sat, 3 Dec 2016 12:19:26 +0000 (13:19 +0100)
gtk/gtkiconhelper.c

index 5404a3c13d8d688801733850458b9eb4a47d1c53..fcf3bbed721976712b9fe64225049ad26b983799 100644 (file)
@@ -565,6 +565,23 @@ gtk_icon_helper_ensure_texture (GtkIconHelper *self,
 
   scale = gtk_widget_get_scale_factor (gtk_css_gadget_get_owner (GTK_CSS_GADGET (self))),
   _gtk_icon_helper_get_size (self, &width, &height);
+
+  if (cairo_image_surface_get_format (self->priv->rendered_surface) != CAIRO_FORMAT_ARGB32)
+    {
+      cairo_surface_t *argb_surface = cairo_surface_create_similar_image (self->priv->rendered_surface,
+                                                                          CAIRO_FORMAT_ARGB32,
+                                                                          width, height);
+      cairo_t *ct;
+      cairo_surface_set_device_scale (argb_surface, scale, scale);
+
+      ct = cairo_create (argb_surface);
+      cairo_set_source_surface (ct, self->priv->rendered_surface, 0, 0);
+      cairo_paint (ct);
+      cairo_destroy (ct);
+      cairo_surface_destroy (self->priv->rendered_surface);
+      self->priv->rendered_surface = argb_surface;
+    }
+
   map = cairo_surface_map_to_image (self->priv->rendered_surface,
                                     &(GdkRectangle) { 0, 0, width * scale, height * scale});